package com.gitee.mrj.aiboot.annotation.config.sf.ui;

import com.gitee.mrj.aiboot.annotation.config.KVS;
import com.gitee.mrj.aiboot.annotation.config.SFDLSSize;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE})
@Documented
public @interface SFRender {
    /**
     * 指定采用什么小部件渲染，所有小部件名可[查阅文档](https://ng-alain.com/)
     */
    String widget() default "";

    /**
     * 自定义类，等同 `[ngClass]` 值
     */
    String[] clazz() default {};

    /**
     * 元素组件大小
     */
    SFDLSSize size() default SFDLSSize.DEFAULT;

    /**
     * 指定宽度，单位：`px`
     */
    int width() default Integer.MIN_VALUE;

    /**
     * 标签可选信息
     */
    String optional() default "";

    String optionalHelp() default "";


    /**
     * 是否开启调试模式，在数据变更、校验会打印出相信信息，不建议在生产环境中使用
     */
    boolean debug() default false;

    /**
     * 属性顺序
     *
     * 当你只想某几个属性靠前时，则允许使用通配符 `*` 来表示剩余部分，且只允许出现一次
     *
     * @example
     *
     * [ 'a', 'b', 'c', 'd' ] + [ 'c', 'b', '*' ] = [ 'c', 'b', 'a', 'd']
     */
//    order?: string[];

    /**
     * 是否隐藏
     */
    boolean hidden() default false;

    /**
     * 指定条件时才显示，但需要**注意**：
     * - 键值表示监听对象属性名
     * - JSON Schema 校验是各属性独立运行，监听对象属性每一次值变化都会重新做一次整个JSON结构计算
     * <p>
     * 有效格式包括：
     * - `visibleIf: { shown: [ true ] }`：当 `shown: true` 时才显示当前属性
     * - `visibleIf: { shown: [ '$ANY$' ] }`：当 `shown` 包括任意值时
     * - `visibleIf: { shown: (value: any, property: FormProperty) => value > 0 }`：复杂表达式
     */
    KVS[] visibleIf() default {};
}
